home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 005 / ippon005.lzh / main.c next >
C/C++ Source or Header  |  2000-07-07  |  6KB  |  267 lines

  1. /* 男は一本槍 */
  2.  
  3. /* main.c */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <sys/dos.h>
  9. #include <sys/iocs.h>
  10. #include <XSP2lib.H>
  11.  
  12.  
  13. #define GLOBAL_DEFINE        /* グローバル変数を確保する */
  14. #include "main.h"
  15. #include "player.h"
  16.  
  17. static int old_crtmod;
  18.  
  19. #define PCG_MAX    256        /* パターンデータの個数 */
  20. #define FRM_MAX    256        /* フレームデータの個数 */
  21. #define REF_MAX    256        /* リファレンスデータの個数 */
  22.  
  23. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  24. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  25. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  26. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  27.  
  28. static int sizeof_pcg = 0;    /* スプライトPCGパターン読み込み数 */
  29. static int sizeof_ref = 0;    /* 複合スプライトリファレンスデータ読み込み数 */
  30. static int sizeof_frm = 0;    /* 複合スプライトフレームデータ読み込み数 */
  31.  
  32. static unsigned short pal_dat[16][15];    /* パレットデータ */
  33.  
  34.  
  35.  
  36. void usage (void)
  37. {
  38.     printf (
  39.                "縦スクロールシューティング・一本槍 IPPON.X ver0.05\n"
  40.                "        programmed by Mitsuky <FreeSoftware>\n"
  41.                "座標を16bit整数+16bit小数の固定小数点で持つようにした\n"
  42.                "それに伴い TBL/XYTABLE.DAT と maketable.x が必要になった\n"
  43.                "スプライト関係のファイルを SP/ へ移動\n"
  44.         );
  45. }
  46.  
  47.  
  48.  
  49. /* 終了時に1度だけ呼ばれる・エラーだったら返ってこない */
  50. void Tini (void)
  51. {
  52.     int sp;
  53.  
  54.     switch (error_level) {
  55.     case ERROR_NON:
  56.         xsp_off ();
  57.         /* 画面モードを元に戻す */
  58.         sp = _iocs_b_super (0);
  59.         *(unsigned short *) 0xe8e006 &= 0xfffd;        /* HRL ビットを元に戻す */
  60.         _iocs_b_super (sp);
  61.         _iocs_crtmod (old_crtmod);
  62.         _dos_kflushio (0xff);    /* キーバッファをクリア */
  63.         /* break が無い事に注意 */
  64.  
  65.     case ERROR_FILE:
  66.         _iocs_tgusemd (1, 3);
  67.         /* break が無い事に注意 */
  68.     case ERROR_GUSEMD:
  69.         _iocs_tgusemd (0, 3);
  70.         /* break が無い事に注意 */
  71.     case ERROR_TUSEMD:
  72.         /* break が無い事に注意 */
  73.     default:
  74.         break;
  75.     }
  76.  
  77.     if (error_level != ERROR_NON) {
  78.         /* エラーが発生した場合 */
  79.         puts (error_message);
  80.         exit (-1);    /* 終了する */
  81.     }
  82. }
  83.  
  84.  
  85.  
  86. /* 起動時のファイル読み込み */
  87. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  88. /* 返り値 : 読み込んだ項目数 */
  89. static int LoadFile (char *fname, void *ptr, size_t size, size_t n)
  90. {
  91.     FILE *fp;
  92.     int i;
  93.  
  94.     fp = fopen (fname, "rb");
  95.     if (fp == NULL) {
  96.         static char e[256];
  97.         error_level = ERROR_FILE;
  98.         error_message = e;
  99.         sprintf (e, "ファイル %s が読み込めません\n", fname);
  100.         Tini ();    /* 返ってこない */
  101.     }
  102.     i = fread (ptr, size, n, fp);
  103.     fclose (fp);
  104.  
  105.     return (i);        /* 返り値は読み込み項目数 */
  106. }
  107.  
  108.  
  109.  
  110. /* XSP 各種データ読み込み・ファイル名は拡張子を付けずに指定すること */
  111. /* 返り値 : 複合スプライトNo. */
  112. static short LoadXSP (char *fname)
  113. {
  114.     int i;
  115.     int p, f, r;
  116.     short obj_no = sizeof_ref;
  117.     char temp_fname[92];
  118.  
  119.     strcpy (temp_fname, fname);
  120.     strcat (temp_fname, ".FRM");
  121.     f = LoadFile (temp_fname, &frm_dat[sizeof_frm], sizeof (XOBJ_FRM_DAT), FRM_MAX - sizeof_frm);
  122.  
  123.     strcpy (temp_fname, fname);
  124.     strcat (temp_fname, ".REF");
  125.     r = LoadFile (temp_fname, &ref_dat[sizeof_ref], sizeof (XOBJ_REF_DAT), REF_MAX - sizeof_ref);
  126.  
  127.     strcpy (temp_fname, fname);
  128.     strcat (temp_fname, ".XSP");
  129.     p = LoadFile (temp_fname, &pcg_dat[sizeof_pcg], sizeof (char), 128 * PCG_MAX - sizeof_pcg);
  130.  
  131.     /* FRM_DAT[].pt 補正 */
  132.     for (i = 0; i < f; i++)
  133.         frm_dat[sizeof_frm + i].pt += sizeof_pcg / 128;
  134.  
  135.     /* REF_DAT[].ptr 補正 */
  136.     for (i = 0; i < r; i++)
  137.         (int) ref_dat[sizeof_ref + i].ptr += (int) (&frm_dat[sizeof_frm]);
  138.     sizeof_pcg += p;
  139.     sizeof_frm += f;
  140.     sizeof_ref += r;
  141.  
  142. #ifdef DEBUG
  143.     printf ("%s を読み込みました sizeof_ref = %hd\n", fname, obj_no);
  144. #endif
  145.  
  146.     return (obj_no);
  147. }
  148.  
  149.  
  150.  
  151. /* 起動時に1度だけ呼ばれる */
  152. static void Init (void)
  153. {
  154.     int sp;
  155.     int i, j;
  156.     static unsigned short crtcdata[9] =
  157.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 0x0111};
  158.     unsigned short *d;
  159.  
  160.     error_message = NULL;
  161.  
  162.     /* テキスト画面の使用状況をチェック */
  163.     error_level = ERROR_TUSEMD;
  164.     if (_iocs_tgusemd (1, -1) == 2) {    /* ユーザーが使用中なら */
  165.         error_message = "テキスト VRAM が使用中です";
  166.         Tini ();
  167.     }
  168.     _iocs_tgusemd (1, 2);
  169.     /* グラフィック画面の使用状況をチェック */
  170.     error_level = ERROR_GUSEMD;
  171.     i = _iocs_tgusemd (0, -1);
  172.     if ((i == 1) || (i == 2)) {    /* システムまたはユーザーが使用中なら */
  173.         error_message = "グラフィック VRAM が使用中です";
  174.         Tini ();
  175.     }
  176.     _iocs_tgusemd (0, 2);
  177.  
  178.  
  179.     /* 各種ファイル読み込み */
  180.     error_level = ERROR_FILE;
  181.     obj_player = LoadXSP ("SP/PLAYER");
  182.     LoadFile ("SP/PLAYER.PAL", &pal_dat, sizeof (unsigned short), 16 * 15);
  183.  
  184.     LoadFile ("TBL/XYTABLE.DAT", &xytable, sizeof (VECTOR), SPEED_MAX * 256);
  185.  
  186.     error_level = ERROR_NON;    /* エラーなし */
  187.  
  188.     /* XSP 関連の初期化 */
  189.     xsp_on ();
  190.     xsp_mode (3);
  191.     /* パターンデータを定義 */
  192.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  193.     xsp_objdat_set (ref_dat);
  194.  
  195.  
  196.     /* 画面モードの初期化 */
  197.     /* 256x256ドット 31kHz 256色モードに */
  198.     old_crtmod = _iocs_crtmod (-1);        /* 前の CRTMOD を保存 */
  199.     _iocs_crtmod (10);    /* 256x256dot 31kHz 256色 */
  200.     _iocs_g_clr_on ();    /* 一応 */
  201.     _iocs_sp_init ();    /* スプライトの初期化 */
  202.     _iocs_sp_on ();
  203.  
  204.     /* 256x256 正方形モードを作る */
  205.     sp = _iocs_b_super (0);
  206.     *(unsigned short *) 0xe80028 = crtcdata[8];
  207.     d = (unsigned short *) 0xe80002;
  208.     for (i = 1; i < 8; i++)
  209.         *d++ = crtcdata[i];
  210.     *(unsigned short *) 0xe80000 = crtcdata[0];
  211.  
  212.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  213.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  214.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  215.     *(unsigned short *) 0xeb080e = crtcdata[6];
  216.     *(unsigned int *) 0xe80018 = *(unsigned int *) 0xe8001c
  217.         = *(unsigned int *) 0xe80020 = *(unsigned int *) 0xe80024
  218.         = (0 << 16) + 0;    /* グラフィック画面の座標 */
  219.  
  220.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  221.     _iocs_b_super (sp);
  222.  
  223.     /* パレットデータを定義 */
  224.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  225.     {
  226.         unsigned short *p = (unsigned short *) pal_dat;
  227.         for (i = 1; i < 15; i++)
  228.             for (j = 0; j < 16; j++)
  229.                 _iocs_spalet (0x80000000 | j, i, *p++);
  230.     }
  231.  
  232. }
  233.  
  234.  
  235.  
  236. /* ゲーム本体 */
  237. static void Game (void)
  238. {
  239.     printf ("ジョイスティックの [A] ボタンを押すと終了します\n");
  240.  
  241.     PlayerInit ();
  242.  
  243.     PlayerAlloc ();
  244.  
  245.     do {
  246.         PlayerMove ();
  247.         xsp_out ();    /* 表示 */
  248.     } while (!game_over);
  249.  
  250.     PlayerFree ();
  251. }
  252.  
  253.  
  254.  
  255. int main (int argc, char *argv[])
  256. {
  257.     if (argc != 1) {
  258.         usage ();
  259.         return (-1);
  260.     }
  261.     Init ();
  262.     Game ();
  263.     Tini ();
  264.  
  265.     return (0);
  266. }
  267.